package com.yourenbang.lingyun.transaction.mapper;

import com.yourenbang.lingyun.transaction.web.domain.dto.BalanceListDTO;
import com.yourenbang.lingyun.transaction.web.domain.dto.fund.*;
import com.yourenbang.lingyun.transaction.web.domain.dto.manage.ManageFundBillDTO;
import com.yourenbang.lingyun.transaction.web.domain.po.FundBill;
import com.yourenbang.lingyun.transaction.web.domain.vo.BalanceListVO;
import com.yourenbang.lingyun.transaction.web.domain.vo.manage.ManageFundBillVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

public interface TransactionFundBillMapper {

    /**
     * 插入
     */
    int insert(FundBill fundBill);

    /**
     * 通过orderNo获取账单
     * @param platNo 平台号
     * @param orderId 订单号
     */
    FundBill getFundBillByOrderId(@Param("platNo") Short platNo, @Param("orderId") String orderId);

    /**
     * 批量插入
     */
    int batchInsert(@Param("platNo") Short platNo, @Param("fundBills") List<FundBill> fundBills);

    /**
     * 更新
     */
    int updateByFundBillId(FundBill fundBill);

    /**
     * 查询已归还提现冻结金额 的条数
     */
    int countReadyreturnFund(@Param("platNo") Short platNo, @Param("orderId") String orderId);

    /**
     * 余额明细
     */
    List<BalanceListVO> queryBalanceList(BalanceListDTO dto);
    /**
     * 余额明细V2 添加了余额显示
     */
    List<BalanceListVO> queryBalanceListV2(BalanceListDTO dto);

    /**
     * 余额明细详情
     */
    BalanceListVO queryBalanceDetail(@Param("platNo") Short platNo, @Param("fundBillId") Integer fundBillId);

    /**
     * 获取当日收入(盟友)
     */
    BigDecimal getAllyTodayIncome(@Param("platNo") Short platNo, @Param("userBaseId") String userBaseId,
                                  @Param("today") String today, @Param("accountTypes") List<Integer> accountTypes);
    BigDecimal getAllyTodayIncomeV2(@Param("platNo") Short platNo, @Param("userBaseId") String userBaseId, @Param("today") String today);

    /**
     * 获取当日收入(商户)
     */
    BigDecimal getMerTodayIncome(@Param("platNo") Short platNo, @Param("userBaseId") String userBaseId,
                                 @Param("today") String today, @Param("accountType") Integer accountType);

    /**
     * 今日收入
     */
    BigDecimal todayEarnings(@Param("platNo") Short platNo, @Param("userBaseId") String userBaseId, @Param("today") String today,
                             @Param("accountTypes") List<Integer> accountTypes, @Param("types") List<Short> types);

    /**
     * 通过资金类型查询 今日收入
     */
    BigDecimal todayEarningsByMainJournalType(@Param("userBaseId") String userBaseId,
                                              @Param("today") String today,
                                              @Param("mainJournalType") List<Integer> mainJournalType,
                                              @Param("types") List<Short> types);
    /**
     * 本月收入
     */
    BigDecimal monthEarnings(@Param("platNo") Short platNo, @Param("userBaseId") String userBaseId, @Param("month") String month,
                             @Param("accountTypes") List<Integer> accountTypes, @Param("types") List<Short> types);

    /**
     * 通过资金类型查询 本月收入
     */
    BigDecimal monthEarningsByMainJournalType(@Param("userBaseId") String userBaseId,
                                              @Param("month") String month,
                                              @Param("mainJournalType") List<Integer> mainJournalType,
                                              @Param("types") List<Short> types);

    /**
     * 历史余额提现金额(迁移数据前的历史 已提现金额)
     */
    BigDecimal historyWithdrawAmt(@Param("userBaseId") String userBaseId);

    /**
     * 查询用户历史充值金额
     * @param userBaseId 用户ID
     * @return 充值金额
     */
    BigDecimal queryHistoryRechargeAmt(@Param("userBaseId") String userBaseId);

    /**
     * 管理后台账户明细
     *
     * @return
     */
    List<ManageFundBillVO> queryFundBill(@Param("dto") ManageFundBillDTO dto);

    /**
     * 管理后台账户明细 -管理津贴
     * @param dto
     * @return
     */
    List<ManageFundBillVO> queryFundBillAllowance(@Param("dto") ManageFundBillDTO dto);

    /**
     * 查询盟友的账户收入
     * @param userBaseId 盟友用户ID
     * @param date 日期
     * @return 账户收入列表
     */
    List<AllyAccountVO> queryAllyAccountIncomeByTime(@Param("userBaseId") String userBaseId, @Param("date") String date);

    /**
     * 按时间归类统计
     */
    List<IncomeStatisticsTotalDTO> statisticsTotalByTime(IncomeStatisticsTotalRequest data);

    /**
     * 按类型归类统计
     */
    List<IncomeStatisticsTotalDTO> statisticsTotalByType(IncomeStatisticsTotalRequest data);

    List<IncomeStatisticsDetailResponse> statisticsDetail(IncomeStatisticsDetailRequest data);
}